严格模式
概述
- 严格模式是什么
严格模式是JavaScript中的一种限制性更强的变种模式。严格模式不是一个子集:它的语义上与正常代码有着明显的差异。
不支持严格模式的浏览器与严格模式的浏览器行为也不一样,所以不要在未经严格模式特性测试情况下使用严格模式。
严格模式可以与非严格模式共存,所以脚本可以逐渐的选择性加入严格模式。
- 严格模式的目的
首先,严格模式会将JavaScript陷阱直接变成明显的错误。
其次,严格模式修正了一些引擎难以优化的错误:同样的代码有些时候严格模式会比非严格模式下更快。
第三,严格模式禁用了一些有可能在未来版本中定义语法。
开启严格模式
- 全局开启严格模式
在JavaScript中想要开启严格模式,需要在所有代码之前,定义一个不会赋给任何变量的字符串:
'use strict';//或者‘use strict’ ;
如果之前的JavaScript代码是非严格模式的话,建议不要盲目为这段代码开启严格模式,这样可能会出现问题。建议按一个个函数去开启严格模式。
- 函数开启严格模式
也可以为某个指定的函数开启严格模式,如下代码示例:
//函数外依旧是非严格模式
function doSomething(){
‘user strict’};开启严格模式
//其他代码
}
在匿名函数中使用严格模式,相当于在全局开启严格模式的变通实现方式。
(function(){
'use strict'};//开启严格模式
})();
变量
- 禁止意外创建严格变量
在严格模式下,不允许意外创建全局变量。
如下代码是非严格模式下意外创建的全局变量。
//message='this is message';
如下代码是严格模式下意外创建全局变量。
'use strict';//开启严格模式
//严格模式下,意外创建全局变量,抛出ReferenceError
message = 'this is message';
- 静默失败转为异常
所谓静默失败就是既不报错也没有任何效果,例如改变常量的值。在严格模式下,静默失败会转换成抛出异常。
如下代码是非严格模式下的静默失败。
const PI= 3.14;
PI =1.14;//静默失败
console.log (PI);//3.14
如下代码是严格模式下的静默失败。
'use strict';//开启严格模式
const PI=3.14;
PI=1.14;//抛出Type Error错误
- 禁用delete 关键字
在严格模式下,不能对变量使用delete运算符。
如下代码是非严格模式下使用delete运算符,结果会静默失败。
var =color = 'red';
delete color ;
如下代码是严格模式下使用delete运算符,结果会抛出异常。
'use strict';//开启严格模式
var =color ='red';
delete color ;//抛出ReferenceError错误
对变量名的限制
在严格模式下,JavaScript对变量名也是有限制。特别不能使用如下内容作为变量名:
implements,interface ,let ,package,private ,protected ,public , static,
yield。
上述内容都是保留字 在ECMAScript的下一个版本中可能会用到他们。在严格模式下,使用上述标识符作为变量名会导致语法错误。
对象
- 不可删除的属性
在严格模式下,不能使用delete运算符删除不可删除的属性。
如下代码是严格模式下使用delete运算符删除不可删除的属性,结果会静默失败。
delete Objcet.prototype;
如下代码是严格模式下使用delete元素安抚删除不可删除的属性,结果会抛出异常。
'use strict';//开启严格模式
delete Object.prototype;//抛出TypeError错误
- 属性名必须唯一
在严格模式下,一个对象内的所有属性名在对象内必须唯一。
如下代码是在非严格模式下重名属性是允许的,最后一个属性决定属性值
var 0 ={ p:1 ,p:2};
如下代码是严格模式下重命属性被认为是错误语法。
'use strict ';开启严格模式。
var 0= {p:1,p:2};//报错
- 只读属性赋值 在严格模式下,不能为一个只读属性进行重新赋值
如下代码是在开启严格模式下为只读属性重新赋值,结果会抛出异常 。
'use strict';开启严格模式
var obj1={};
Object.defoneProperty(OBJ1,‘x’),{value 42,writable:false});obj1.x=9;//将属性设置为只读
- 不可扩展的对象
在严格模式下不能为不可扩展的对象添加新属性。
'use strict';开启严格模式
var obj={}
Object.preventExtensions(obj);//将对象变得不可扩展
obj.newprop ='ohai';//抛出typeError错误
结果会出现异常
函数
- 参数名必须唯一
在严格模式下,要求命名函数的参数必须唯一。
function sum(a,a,b){
//语法错误
'use strict';
return a+a+c;//代码运行到这里会报错
}
- arguments的不同
在严格模式下,arguments对象的行为也有所不用。
严格模式下,修改命名参数的值也会反应到argument对象中。
严格模式下,命名参数与arguments对象是完全独立的。
function showValue(value){
value ='foo';
console.log(value);//foo
console.log(arguments[0]);//在严格模式下foo
//在非严格模式下hello
}
showValue ('hello');
arguments.callee()
在严格模式下,不能使用arugments 对象的callee()方法。
在严格模式下使用arguments对象的callee()方法,结果会抛出异常。
'use strict';//开启严格模式
var f =function(){
return arguments.callee;};
f();//抛出TypeError错误
函数声明的限制
在严格模式下,只能在全局和函数域中声明函数
如下代码是严格模式下在出全局域和函数域中声明函数是错误语法
'use strict';//开启严格模式
if(true){
function f(){}//错误语法
}
eval(函数)
- 增加eval作用域
在严格模式下,使用eval()函数创建的变量只能在eval()函数内部使用。
如下代码是严格下eval()函数创建的变量只能在eval()函数内部使用
'use strict';开启严格模式
eval('var x =412');
console.log(x);//抛出RefeienceError错误
arguments对象
- 禁止读写
在严格模式下,以下的所有尝试导致语法错误:
'use strict';开启严格模式
eval=17 ;
arguments++;
++eval;
var obj ={set p (arguments){}};
var eval;
try {}catch(arguments){}
function x(eval){}
function arguments(){}
var y =function eval(){}
var f =new Function('arguments','use strict','return 17');
this 关键字
- 抑制关键字
在严格模式下使用函数的apply()call()方法是,NULL或undefind值会被转换为全局对象。
在严格模式下,函数的this值始终是指定的值。
var color ='red';
function sayColor(){
console.log(this.color)}//非严格模式下red
//严格模式下 抛出错误
}
say Color.call(null);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。